package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;


/**
 * 用户服务接口实现类
 * @author wangxin
 * @version 1.0
 */
@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 根据用户名查询数据用户信息

     */
    @Override
    public User findByUserName(String username) {
        return userDao.findByUserName(username);
    }

    /**
     * 分页查询用户管理的数据
     * @param queryPageBean
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //设置分页参数
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize()); //参数:1.当前页码 2.每页显示多少条
        //需要被分页的语句查询(一定要写道第一行代码后边)

        Page<User> UserList= userDao.selectByCondition(queryPageBean.getQueryString()); //参数:查询条件
        //封装分页PageInfo对象  因为我们还需要得到总记录数,而这个计算由PageInfo来帮我们完成
        return new PageResult(UserList.getTotal(),UserList.getResult());

    }

    /**
     * 根据id获得用户管理数据
     * @param id id
     */
    @Override
    public User findById(Integer id) {
        return userDao.findById(id);
    }

    /**
     * 根据id获得权限ids列表
     */
    @Override
    public List<Integer> findRoleIds(Integer userId) {
        return userDao.findRoleIds(userId);
    }

    /**
     * 添加用户
     */
    @Override
    public void add(User user, Integer[] roleIds) {
        //默认用户状态正常
        user.setStation("1");
        //初始密码为手机号后6位,密码使用bCrypt加密
        String password = user.getTelephone().substring(user.getTelephone().length() - 6);
        BCryptPasswordEncoder bCrypt = new BCryptPasswordEncoder();
        //对密码进行加密
        password = bCrypt.encode(password);
        //补全user信息,创建时账号状态正常
        user.setPassword(password);
        //添加用户
        userDao.add(user);
        //添加角色关系
        addUserAndRoleRelationShip(user.getId(),roleIds);
    }

    /**
     * 删除用户
     */
    @Override
    public void delete(Integer id) {
        //删除关联关系
        userDao.deleteUserAndRoleRelation(id);
        //删除用户信息
        userDao.delete(id);
    }

    /**
     * 编辑用户信息
     */
    @Override
    public void edit(User user, Integer[] roleIds) {
        //修改用户信息
        userDao.edit(user);
        //删除关联信息
        userDao.deleteUserAndRoleRelation(user.getId());
        //重新添加关联信息
        addUserAndRoleRelationShip(user.getId(),roleIds);
    }

    /**
     * 改变用户状态
     */
    @Override
    public void changeStationByUsername(HashMap<String,String> param) {
        userDao.changeStationByUsername(param);
    }

    /**
     *修改密码
     */
    @Override
    public void changePassword(HashMap<String, String> param) {
        userDao.changePassword(param);
    }

    /**
     * 根据用户名获得用户电话
     */
    @Override
    public String findTelephoneByUsername(String username) {
        return userDao.findTelephoneByUsername(username);
    }

    /**
     * 添加用户角色关系
     */
    public void addUserAndRoleRelationShip(Integer userId,Integer[] roleIds) {
        if (roleIds !=null && roleIds.length > 0){
            HashMap<String, Integer> param = new HashMap<>();
            param.put("userId",userId);
            for (Integer roleId : roleIds) {
                param.put("roleId",roleId);
                userDao.addUserAndRoleRelationShip(param);
            }
        }
    }


}
